home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
dir
/
dum2
/
src
/
duwindow.mod
< prev
next >
Wrap
Text File
|
1987-05-28
|
14KB
|
405 lines
IMPLEMENTATION MODULE DuWindow;
(*$S-*)(*$T-*)(*$A+*)
(*
PART OF DirUtil for Modula 2
This creates, opens and maintains the DirUtil window.
It contains a couple of other importable routines for
user alterations.
Written: 3/21/87 by Greg Browne
Compiles on TDI's Modula-2 Compiler version 2.20a
NOTES: I kept being bugged with RefreshWindow not being exported from
Intuition as a flag. Then I found that it is either misspelled
in the .def module (as ResfreshWindow) or that it is supposed
to mean ResetFreshWindow. Don't know whats up but it works now.
*)
FROM SYSTEM IMPORT ADR, BYTE, ADDRESS, NULL,TSIZE,CODE;
FROM Intuition IMPORT ActivationFlags,ActivationFlagSet,
Gadget,GadgetFlags,GadgetFlagSet,GadgetPtr,
PropFlags,PropInfo,PropFlagSet,StringInfo,
IntuitionTextPtr,IntuitionText,IntuitionName,
IntuitionBase,IntuiMessagePtr,RequesterPtr,
Window,WindowFlags,WindowPtr,NewWindow,
IDCMPFlags,IDCMPFlagSet,WindowFlagSet,
WBenchScreen,Border,SmartRefresh,ScreenFlagSet,
Image;
FROM GraphicsLibrary IMPORT GraphicsName, GraphicsBase,DrawingModes,
DrawingModeSet,Jam1;
FROM Libraries IMPORT OpenLibrary,CloseLibrary;
FROM Windows IMPORT OpenWindow,CloseWindow;
FROM Gadgets IMPORT RefreshGadgets,HighNone,HighComplement,
ModifyProp,BoolGadget,PropGadget,StrGadget,
AddGadget,RemoveGadget;
(*--------------------------------------------------------------------*)
(* ALL CONSTANTS AND MOST VARIABLES/TYPES DEFINED IN .DEF FILE
FOR IMPORTATION
CONST
StringBufSize = 255;
RegFlags = ActivationFlagSet{RelVerify,GadgetImmediate};
StringFlags = ActivationFlagSet{StringCenter} + RegFlags;
JamTwo = DrawingModeSet{Jam2};
SliderFlags = PropFlagSet{FreeVert,AutoKnob};
TYPE
WBColors = (Blue,White,Black,Green); (* My workbench colors *)
Gadgets are addressed as a set. First are the devices, then the message
string gadgets, then the command gadgets, and finally the slider. Note
that this is larger than a BITSET already, so the 'GadgetID' is passed as
a set name and converted as CARDINAL(ORD(whatever)). Expansion of the set
should be easy, with only screen positioning being the hard part.
GadgetNames = (df0,df1,df2,dh0,dh1,ram,vd0,
run,source,dest,msg,
filewindow,
arc,bytes,clear,copy,copydel,deldir,edit,execfr,execrf,
hprint,htype,info,makedir,move,parent,print,rename,
root,runfr,runrf,select,show,type,unarc,zapfile,
dtor,dtos,rtod,rtos,stod,stor,swapsd,swaprd,swaprs,
slider);
END OF EXTERNAL TYPES & CONSTANTS *)
TYPE
BorderTypes = (filewind,rsd,device,command,message);
VAR
SlideImage : Image;
Borders : ARRAY BorderTypes OF Border;
SlideInfo : PropInfo;
(* EXTERNAL AVAILABLE VARIABLES
IOStringInfo : ARRAY[run..filewindow] OF StringInfo;
NullReqPtr : RequesterPtr; (* initialized to be NULL always *)
DuWindowPtr : WindowPtr;
IOString : ARRAY[run..filewindow] OF ARRAY[0..StringBufSize-1] OF CHAR;
GadTxt : ARRAY GadgetNames OF IntuitionText;
DuGads : ARRAY GadgetNames OF Gadget;
*)
(* ---------------------------*)
(* INTERNAL ONLY PROCEDURES *)
(* ---------------------------*)
PROCEDURE InitWindow(VAR text:ARRAY OF CHAR;FirstGad:ADDRESS):WindowPtr;
VAR w : NewWindow;
BEGIN
WITH w DO
LeftEdge := 0; TopEdge := 0;
Width := 640; Height := 156;
DetailPen := BYTE (0); BlockPen := BYTE (1);
Title := ADR(text);
Flags := WindowFlagSet{WindowSizing,WindowDepth,WindowDrag,RMBTrap,
Activate,NoCareRefresh,WindowClose} + SmartRefresh;
IDCMPFlags := IDCMPFlagSet{CloseWindowFlag,MouseButtons,
ResfreshWindow,GadgetUp};
Type := ScreenFlagSet {WBenchScreen};
CheckMark := NULL;
FirstGadget := FirstGad;
Screen := NULL; BitMap := NULL;
MinWidth := 150; MinHeight := 75;
MaxWidth := 640; MaxHeight := 156;
END;
RETURN OpenWindow(w)
END InitWindow;
(* ---------------------------*)
(* Entry/exit code off to create "static" border structures with CODE *)
(* This method saves size since I am keeping it under 32767 for $A+ *)
(* ---------------------------*)
(*$P-*)
PROCEDURE CBorder;
BEGIN
CODE(0FFFFH,0FFFFH,69,0FFFFH,69,9,0FFFFH,9,0FFFFH,0FFFFH);
END CBorder;
(*$P-*)
PROCEDURE DBorder;
BEGIN
CODE(0FFFFH,0FFFFH,39,0FFFFH,39,9,0FFFFH,9,0FFFFH,0FFFFH);
END DBorder;
(*$P-*)
PROCEDURE MBorder;
BEGIN
CODE(0FFFEH,0FFFEH,576,0FFFEH,576,8,0FFFEH,8,0FFFEH,0FFFEH);
END MBorder;
(*$P-*)
PROCEDURE RBorder;
BEGIN
CODE(0FFFEH,0FFFEH,280,0FFFEH,280,8,0FFFEH,8,0FFFEH,0FFFEH);
END RBorder;
(*$P-*)
PROCEDURE FBorder;
BEGIN
CODE(0FFFFH,0FFFFH,283,0FFFFH,283,121,0FFFFH,121,0FFFFH,0FFFFH);
END FBorder;
(*$P+*)
(* ---------------------------*)
PROCEDURE SetIText(VAR it :IntuitionText;
VAR text :ARRAY OF CHAR;
Left,Top :INTEGER;
FColor,BColor:WBColors;
Mode :DrawingModeSet);
BEGIN
WITH it DO
FrontPen := BYTE(ORD(FColor));
BackPen := BYTE(ORD(BColor));
DrawMode := BYTE(Mode);
LeftEdge := Left; TopEdge := Top;
ITextFont := NULL; IText := ADR(text);
NextText := NULL;
END;
END SetIText;
(* ---------------------------*)
PROCEDURE OneGadget(VAR gadg:Gadget; L,T,W,H:INTEGER;
GadFlags:GadgetFlagSet; textptr:ADDRESS;
ActFlags:ActivationFlagSet; Bdr:ADDRESS;
spinfoptr:ADDRESS; GadType:CARDINAL;
GadID:GadgetNames);
BEGIN
WITH gadg DO
NextGadget := NULL;
LeftEdge := L; TopEdge := T;
Width := W; Height := H;
Flags := GadFlags; Activation := ActFlags;
GadgetType := GadType; GadgetRender := Bdr;
SelectRender := NULL; GadgetText := textptr;
MutualExclude := 0; SpecialInfo := spinfoptr;
GadgetID := CARDINAL(ORD(GadID));
UserData := NULL;
END
END OneGadget;
(* ---------------------------*)
PROCEDURE InitGadgets():ADDRESS;
(*
Procedure to initialize all the gadgets and related structures
internal to the module only
*)
VAR i,m:GadgetNames; j,k: CARDINAL;
BEGIN
WITH Borders[command] DO (* Point to the borders *)
LeftEdge := 0; TopEdge := 0; (* And define color/type *)
FrontPen := BYTE(1); BackPen := BYTE(0);
DrawMode := BYTE(Jam1); Count := BYTE(5);
XY := ADDRESS(CBorder); NextBorder := NULL
END;
Borders[device] := Borders[command]; (* all same except sizes *)
Borders[device].XY := ADDRESS(DBorder);
Borders[message] := Borders[command];
Borders[message].XY := ADDRESS(MBorder);
Borders[rsd] := Borders[command];
Borders[rsd].XY := ADDRESS(RBorder);
Borders[filewind] := Borders[command];
Borders[filewind].XY := ADDRESS(FBorder);
(* This section sets up the gadget text and colors/rendering *)
SetIText(GadTxt[df0], "df0:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[df1], "df1:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[df2], "df2:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[dh0], "dh0:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[dh1], "dh1:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[ram], "ram:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[vd0], "vd0:", 3,1,Black,Blue,Jam1);
SetIText(GadTxt[run], "R", -14,0,Green,Blue,Jam1);
SetIText(GadTxt[source], "S", -14,0,Green,Blue,Jam1);
SetIText(GadTxt[dest], "D", -14,0,Green,Blue,Jam1);
SetIText(GadTxt[msg], "M", -14,0,Green,Blue,Jam1);
SetIText(GadTxt[filewindow],"", 0,0,Green,Blue,Jam1);
SetIText(GadTxt[arc], "ARC", 22,1,White,Blue,Jam1);
SetIText(GadTxt[bytes], "BYTES", 14,1,White,Blue,Jam1);
SetIText(GadTxt[clear], "CLEAR", 14,1,White,Blue,Jam1);
SetIText(GadTxt[copy ], "COPY", 18,1,White,Blue,Jam1);
SetIText(GadTxt[copydel], "COPYDEL", 6,1,White,Blue,Jam1);
SetIText(GadTxt[deldir], "DELDIR", 10,1,White,Blue,Jam1);
SetIText(GadTxt[edit ], "EDIT", 18,1,White,Blue,Jam1);
SetIText(GadTxt[execfr], "EXEC f+R",2,1,White,Blue,Jam1);
SetIText(GadTxt[execrf], "EXEC R+f",2,1,White,Blue,Jam1);
SetIText(GadTxt[hprint], "HPRINT", 10,1,White,Blue,Jam1);
SetIText(GadTxt[htype], "HTYPE", 14,1,White,Blue,Jam1);
SetIText(GadTxt[info], "INFO", 18,1,White,Blue,Jam1);
SetIText(GadTxt[makedir], "MAKEDIR", 6,1,White,Blue,Jam1);
SetIText(GadTxt[move], "MOVE", 18,1,White,Blue,Jam1);
SetIText(GadTxt[parent], "PARENT", 10,1,White,Blue,Jam1);
SetIText(GadTxt[print], "PRINT", 14,1,White,Blue,Jam1);
SetIText(GadTxt[print], "PRINT", 14,1,White,Blue,Jam1);
SetIText(GadTxt[rename], "RENAME", 10,1,White,Blue,Jam1);
SetIText(GadTxt[root], "ROOT", 18,1,White,Blue,Jam1);
SetIText(GadTxt[runfr], "RUN f+R", 6,1,White,Blue,Jam1);
SetIText(GadTxt[runrf], "RUN R+f", 6,1,White,Blue,Jam1);
SetIText(GadTxt[select], "SELECT", 10,1,White,Blue,Jam1);
SetIText(GadTxt[show], "SHOW", 18,1,White,Blue,Jam1);
SetIText(GadTxt[type], "TYPE", 18,1,White,Blue,Jam1);
SetIText(GadTxt[zapfile], "ZAPFILE", 6,1,White,Blue,Jam1);
SetIText(GadTxt[dtor], "D -> R", 10,1,White,Blue,Jam1);
SetIText(GadTxt[dtos], "D -> S", 10,1,White,Blue,Jam1);
SetIText(GadTxt[rtod], "R -> D", 10,1,White,Blue,Jam1);
SetIText(GadTxt[rtos], "R -> S", 10,1,White,Blue,Jam1);
SetIText(GadTxt[stod], "S -> D", 10,1,White,Blue,Jam1);
SetIText(GadTxt[stor], "S -> R", 10,1,White,Blue,Jam1);
SetIText(GadTxt[swapsd], "SWAP S-D",2,1,White,Blue,Jam1);
SetIText(GadTxt[swaprd], "SWAP R-D",2,1,White,Blue,Jam1);
SetIText(GadTxt[swaprs], "SWAP R-S",2,1,White,Blue,Jam1);
WITH SlideInfo DO (* Define the slider information *)
Flags := SliderFlags;
VertPot := 8000H;
VertBody := 0FFFFH;
END;
FOR i := run TO filewindow DO (* Setup and null all IOStringInfos *)
IOString[i] := "";
WITH IOStringInfo[i] DO
Buffer := ADR(IOString[i]); UndoBuffer := NULL;
BufferPos := 0; MaxChars := StringBufSize;
DispPos := 0; NumChars := 0;
END;
END;
(* THIS SECTION NOW DEFINES THE GADGETS AND LINKS UP THE STRUCTURES *)
(*Device gadgets*)
j := 6;
FOR i := df0 TO vd0 DO
OneGadget(DuGads[i], j, 14, 38, 9,HighComplement,
ADR (GadTxt[i]), RegFlags,ADR(Borders[device]),
NULL, BoolGadget, i);
INC(j,41)
END;
(* String gadgets *)
j := 117;
FOR i := run TO dest DO
OneGadget(DuGads[i], 324, j, 280, 10, HighComplement,
ADR (GadTxt[i]), RegFlags, ADR(Borders[rsd]),
ADR (IOStringInfo[i]), StrGadget, i);
INC(j,10);
END;
OneGadget(DuGads[msg], 28, 147, 576, 10, HighComplement,
ADR (GadTxt[msg]), RegFlags, ADR(Borders[message]),
ADR (IOStringInfo[msg]), StrGadget, msg);
OneGadget(DuGads[filewindow], 5, 24, 281, 121, HighNone,
ADR(GadTxt[filewindow]), RegFlags,ADR(Borders[filewind]),
NULL,BoolGadget, filewindow);
(* Command gadgets *)
j := 14; k := 308;
FOR i := arc TO swaprs DO
OneGadget(DuGads[i], k, j, 68, 9, HighComplement,
ADR (GadTxt[i]), RegFlags,ADR(Borders[command]),
NULL, BoolGadget, i);
INC(j,10);
IF j>104 THEN
j := 14;
INC(k,71);
END;
END;
(* Slider gadget *)
OneGadget(DuGads[slider], 289, 23, 18, 122, HighComplement,
NULL, RegFlags, ADR(SlideImage),
ADR(SlideInfo), PropGadget, slider);
FOR i := df0 TO swaprs DO
m := i; INC(m);
DuGads[i].NextGadget := ADR(DuGads[m])
END;
RETURN ADR(DuGads[df0])
END InitGadgets;
(* ---------------------------*)
(* EXTERNAL PROCEDURES *)
(* ---------------------------*)
PROCEDURE SlidePot():CARDINAL;
(*
Function returns the current value of the slider VertPot)
*)
BEGIN
RETURN CARDINAL(SlideInfo.VertPot);
END SlidePot;
PROCEDURE ResetSlider(bod:CARDINAL);
(*
Resets slide gadget size to the size passed in
*)
BEGIN
ModifyProp(DuGads[slider],DuWindowPtr,NullReqPtr^,SliderFlags,0,0,0,bod);
END ResetSlider;
(* ---------------------------*)
PROCEDURE CloseDuWindow;
(*
Closes the window and intuition and graphics bases if they are open
*)
BEGIN
IF (DuWindowPtr # NULL) THEN CloseWindow (DuWindowPtr^) END;
IF IntuitionBase <> 0 THEN CloseLibrary(IntuitionBase) END;
IF GraphicsBase <> 0 THEN CloseLibrary(GraphicsBase) END;
END CloseDuWindow;
(* ---------------------------*)
PROCEDURE OpenDuWindow(VAR name:ARRAY OF CHAR):BOOLEAN;
(*
The external primary procedure - sets up and opens the window
*)
BEGIN
IF (GraphicsBase <> 0) AND (IntuitionBase <> 0) THEN
DuWindowPtr := InitWindow(name,InitGadgets());
RETURN (DuWindowPtr # NULL)
ELSE
RETURN FALSE
END
END OpenDuWindow;
(********)
(* MAIN *)
(********)
BEGIN
NullReqPtr := NULL;
IntuitionBase := OpenLibrary (IntuitionName,0);
GraphicsBase := OpenLibrary (GraphicsName,0);
END DuWindow.